home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
misc
/
emu
/
QDOS2.lha
/
QLsource
/
ROMsrc
/
JAN
/
JAN_asm
Wrap
Text File
|
1992-01-07
|
12KB
|
557 lines
SECTION JAN
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; JAN_asm - directory device driver for JANUS IBM interface
; - last modified 07/01/92
; Directory device driver for the JANUS IBM interface for use
; with the TURBO-PASCAL program QLDISK
; This device driver is very simple!
; More sofisticated software would make use of the slave
; blocks. But this Program was written within three weeks
; evenings (together with the TURBO PASCAL part on the IBM).
; It works, that's all !
; QDOS-Amiga sources by Rainer Kowallik
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BASE:
DC.L $4AFB0001 ; ROM recognition code
DC.W FNTAB-BASE
DC.W INIT-BASE
DC.B 0,20,'JANus device driver',$A
FNTAB DC.W 5 ; 5 procedures
DC.W CHDIR-*
DC.B 5,'CHDIR'
DC.W SHODIR-*
DC.B 6,'SHODIR',0
DC.W MKDIR-*
DC.B 5,'MKDIR'
DC.W RMDIR-*
DC.B 5,'RMDIR'
DC.W JAN_USE-*
DC.B 7,'JAN_USE'
DC.W 0
DC.W 0
DC.W 0
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
INIT:
movem.l a0/a3,-(a7) ;*/mend
; first we try to find the Buffer address of the Dual ported RAM
MOVE.L #$910000,A2 ; highest possible address
MOVE.L #$100000,D0 ; decrement for searching
MOVE.L #$210000,D1 ; lowest possible address
SEA_JAN:
SUB.L D0,A2
CMP.W #$4AFB,(A2) ; test for QDOS identifier
BEQ.S JANFOUND
CMP.L A2,D1 ; give up ?
BNE.S SEA_JAN
BRA NOTFOUND
JANFOUND:
LEA DPRAM(PC),A3 ; (changed to LEA(PC) - MJS)
MOVE.L A2,(A3) ; save this address
MOVE.B #$AA,(A2) ; signal QDOS request to IBM
;
MOVEQ #$18,D0 ; MT.ALCHP
MOVEQ #$42,D1 ; We need some memory
MOVEQ #0,D2 ; owned by job 0
TRAP #1
TST.L D0
BNE.S ERR_EXIT
LEA $1C(A0),A3 ; start filling linkage
; block
LEA FS_JAN(PC),A2 ; I/O routine (changed to
; LEA(PC) - MJS)
MOVE.L A2,(A3)+ ; at $1C
LEA JAN_OPEN(PC),A2 ; Open
MOVE.L A2,(A3)+ ; at $20
LEA JAN_CLOSe(PC),A2 ; close
MOVE.L A2,(A3)+ ; at $24
LEA JAN_SERV(PC),A2 ; forced slaving
MOVE.L A2,(A3)+ ; at $28
ADDQ.L #8,A3 ; next two long words are
; reserved
LEA JAN_FORMat(PC),A2 ; Format routine
MOVE.L A2,(A3)+ ; at $34
MOVE.L #$428,(A3)+ ; length of physical def.
; block at $38
MOVE.W #3,(A3)+ ; length of drive name at
; $3C
MOVE.L #$4A414E00,(A3)+ ; drive name 'JAN' at $3E
LEA $18(A0),A0 ; link address
MOVEQ #$22,D0 ; MT.LDD link in Directory
; device driver
TRAP #1
ERR_EXIT:
movem.l (a7)+,a0/a3 ;*/mend
RTS
DPRAM DS.L 2
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; if the IBM server was not found, tell this to the USER
NOTFOUND:
LEA NF_MESS(PC),A1 ; (changed to LEA(PC) - MJS)
MOVE.W (A1)+,D2 ; number of bytes to send
BSR IOSSTRG
MOVEQ #8,D0 ; MT.SUSJB
MOVEQ #-1,D1 ; me
SUBA.L A1,A1 ; no flag
MOVEQ #100,D3 ; 2 seconds to read the
; message
TRAP #1
BRA.S ERR_EXIT
NF_MESS DC.B 0,36,'!!!! QLDISK not running on IBM !!!!',$A
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; here we handle those routines, which are not actually used
JAN_SERV:
RTS
JAN_FORMat:
MOVEQ #-19,D0 ; not implemented yet
RTS
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
INIDPRAM:
MOVE.L DPRAM,A2 ; get start of dualported
; RAM
CMP.B #$55,(A2) ; IBM ready ?
BNE.S ERR_NC
MOVE.B D0,2(A2) ; tell IBM the function
; number
RTS
ERR_NC:
ADDQ.L #4,A7
MOVEQ #-1,D0
RTS
IBM_EXIT:
MOVE.B #$AA,(A2)
IBM_WAIT:
NOP ; Wait a bit
NOP
NOP
NOP
CMP.B #$55,(A2) ; IBM ready ?
BNE.S IBM_WAIT
MOVEQ #0,D0
MOVE.B 1(A2),D0 ; get error flag
TST.B D0
BEQ.S IBMEXITX
OR.L #$FFFFFF00,D0 ; extend error to negative
; long
IBMEXITX:
RTS
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; I/O routines
; A0 points to the channel definition block
FS_JAN ; I/O for JANus driver
BSR INIDPRAM ; get address of dual ported
; RAM ...
MOVE.B $1F(A0),4(A2) ; set File number for
; operation
CMP.B #1,D0 ; IO.FBYTE ?
BEQ IO_FBYTE
CMP.B #2,D0 ; IO.FLINE ?
BEQ IO_FLINE
CMP.B #3,D0 ; IO.FSTRG ?
BEQ IO_FSTRG
CMP.B #5,D0 ; IO.SBYTE ?
BEQ IO_SBYTE
CMP.B #7,D0 ; IO.SSTRG ?
BEQ IO_SSTRG
CMP.B #$42,D0 ; FS.POSAB ?
BEQ FS_POSAB
CMP.B #$43,D0 ; FS.POSRE ?
BEQ FS_POSRE
CMP.B #$45,D0 ; FS.MDINF ?
BEQ FS_MDINF
CMP.B #$46,D0 ; FS.HEADS ?
BEQ FS_HEADS
CMP.B #$47,D0 ; FS.HEADR ?
BEQ FS_HEADR
CMP.B #$48,D0 ; FS.LOAD ?
BEQ FS_LOAD
CMP.B #$49,D0 ; FS.SAVE ?
BEQ FS_SAVE
BRA IBM_EXIT ; The other functions don't
; need parameters
IO_FBYTE:
BSR IBM_EXIT
MOVE.B 6(A2),D1 ; get byte
TST.B D0 ; set flags on error
RTS
IO_FLINE:
IO_FSTRG:
MOVE.W D2,6(A2) ; number of bytes to fetch
BSR IBM_EXIT
LEA 6(A2),A3
MOVEQ #0,D1 ; reset number of bytes
; fetched
MOVE.W (A3)+,D1 ; get number of bytes
MOVE.W D1,D7
CPY_IOFS:
MOVE.B (A3)+,(A1)+ ; copy line to buffer
DBRA D7,CPY_IOFS
TST.B D0 ; set flags on error
RTS
IO_SBYTE:
MOVE.B D1,6(A2) ; put byte into buffer
BRA IBM_EXIT
IO_SSTRG:
MOVE.W D2,D1 ; assume, we are sending all
; bytes
MOVE.W D2,D7
MOVE.W D2,6(A2) ; tell length of string to
; IBM
LEA 8(A2),A3 ; get string body
CPY_IOSS:
MOVE.B (A1)+,(A3)+ ; copy string to send
DBRA D7,CPY_IOSS
BRA IBM_EXIT
FS_POSAB:
FS_POSRE:
MOVE.L D1,6(A2) ; write offset or absolute
; pointer to IBM
BSR IBM_EXIT
MOVE.L 6(A2),D1 ; get new file position
TST.B D0 ; set flags on error
RTS
FS_MDINF:
BSR IBM_EXIT
MOVE.L 6(A2),D1 ; get empty/good sectors
MOVEQ #10,D2 ; number of bytes of Medium
; name
LEA $A(A2),A5
CPY_MDI:
MOVE.B (A5)+,(A1)+
DBRA D2,CPY_MDI
TST.B D0
RTS
FS_LOAD:
MOVE.L D2,D7 ; length of file
MOVE.B #$AA,(A2) ; start transfer
LOA_512:
BSR WT_IBM5
CMP.L #512,D7
BLT.S CPY_LREM
CPY_L512:
MOVE.L (A5)+,(A1)+
DBRA D5,CPY_L512
MOVE.B #$AA,5(A2) ; signal 'ready' to IBM
SUB.L #512,D7
BRA LOA_512
BSR WT_IBM5
CPY_LREM:
SUBQ.L #1,D7
BMI.S TSTD0RTS
MOVE.B (A5)+,(A1)+ ; copy remainding bytes
BRA.S CPY_LREM
TSTD0RTS:
MOVE.B #$AA,5(A2) ; signal 'ready' to IBM
BRA IBM_WAIT
WT_IBM5:
NOP
NOP
NOP
NOP
NOP
NOP
CMP.B #$55,5(A2) ; IBM ready ?
BNE.S WT_IBM5
LEA 6(A2),A5 ; get buffer start
MOVE.W #127,D5
RTS
FS_SAVE:
MOVE.L D2,6(A2) ; tell IBM length of file
MOVE.L D2,D7 ; length of file
MOVE.B #$AA,(A2) ; initialize transfer
SAV_512:
BSR WT_IBM5
CMP.L #512,D7
BLT.S CPY_SREM
CPY_S512:
MOVE.L (A1)+,(A5)+
DBRA D5,CPY_S512
MOVE.B #$AA,5(A2) ; signal 'ready' to IBM
SUB.L #512,D7
BRA SAV_512
BSR WT_IBM5
CPY_SREM:
SUBQ.L #1,D7
BMI.S TSTD0RTS
MOVE.B (A1)+,(A5)+ ; copy remainding bytes
BRA.S CPY_SREM
FS_HEADR:
BSR IBM_EXIT ; read header
MOVE.L D2,D1 ; length of file header read
MOVE.L D2,D7 ; assume, its OK
LEA 6(A2),A5 ; Get dual ported buffer
BRA CPY_LREM ; OK, bad style, but it
; works !
FS_HEADS:
MOVEQ #14,D1 ; this will be the correct
; length
MOVEQ #14,D7 ; counter
LEA 6(A2),A5 ; Get dual ported buffer
BSR CPY_SREM ; again bad style...
BRA IBM_EXIT ; the rest will be done by
; the IBM
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; OPEN routine
; A0 points to the channel definition block
; A1 points to the physical definition block
; A3 points to the assumed basse of the linkage block
; DELETE is performed if the file access key $1C(A0) is negative
FNUMS DC.L 0 ; here we store the
; filenumber in use
JAN_OPEN ; open microdrive channel
MOVE.B $1C(A0),D0 ; get access mode
OR.B #$80,D0 ; signal OPEN call
BSR INIDPRAM ; get address of dual ported
; RAM...
MOVE.B #0,1(A2) ; reset error flag from last
; call
LEA $32(A0),A5 ; point to file name
LEA 6(A2),A4 ; point to PASCAL string for
; name
MOVE.W (A5)+,D0 ; get length of name
MOVE.B D0,(A4)+
WRFNAM1 ; copy file name
MOVE.B (A5)+,(A4)+
DBRA D0,WRFNAM1
MOVE.W #$FF,D0 ; dummy file number
TST.B $1C(A0) ; only delete call ?
BMI IBM_EXIT
LEA FNUMS(PC),A5 ; now find the next free
; filenumber
; (changed to LEA(PC) - MJS)
MOVE.L (A5),D1
CMP.L #-1,D1 ; all numbers used ?
BEQ ERR_IU
MOVEQ #-1,D0
FFNUM ADDQ.L #1,D0
BTST D0,D1
BNE.S FFNUM
BSET D0,D1 ; mark filenumber as used
MOVE.L D1,(A5)
IBM_OPEN:
MOVE.B D0,4(A2) ; give filenumber to IBM
MOVE.B #$AA,(A2) ; let the IBM do its work
MOVE.W D0,$1E(A0) ; store filenumber to
; channel def. block
BSR IBM_WAIT ; handshake and error
; handling
TST.B D0 ; any errors ?
BEQ.S RET
MOVE.W $1E(A0),D2 ; restore file number
MOVE.L (A5),D1
BCLR D2,D1 ; reset usage
MOVE.L D1,(A5) ; and save this
TST.B D0
RET RTS
ERR_IU MOVEQ #-9,D0
RTS
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; CLOSE routine
; A0 points to the channel definition block
; A3 points to the device driver definition block
JAN_CLOSe ; channel close for Microdrive device driver
MOVE.B #$90,D0 ; signal CLOSE call to IBM
BSR INIDPRAM ; get address of dual ported
; RAM ...
MOVE.W $1E(A0),D0 ; restore file number
LEA FNUMS(PC),A5 ; (changed to LEA(PC) - MJS)
MOVE.L (A5),D1 ; get numbers of files in
; use
BCLR D0,D1 ; reset actual file number
MOVE.L D1,(A5)
MOVE.B D0,4(A2) ; tell IBM, which file
; number to close
BSR GETTIME
MOVE.L D1,6(A2) ; give QDOS time to IBM
BSR IBM_EXIT ; Let IBM close the file
MOVE.L A0,-(A7) ; clean up
LEA $18(A0),A0 ; Link to next file system
; channel
LEA $140(A6),A1 ; pointer to list of file
; channel defs
BSR MT_UNLNK
MOVE.L (A7)+,A0
BRA MM_RECHP
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MT_UNLNK:
MOVE.W $D4,-(A7)
CLR.W -(A7)
RTS
MM_RECHP:
MOVE.W $C2,-(A7)
CLR.W -(A7)
RTS
CA_GTSTR:
MOVE.W $116,-(A7)
CLR.W -(A7)
RTS
IOSSTRG:
suba a0,a0 ; -> channel 0 (mjs)
MOVEQ #-1,D3 ; don't time out
MOVEQ #7,D0 ; IO.SSTRG
TRAP #3
RTS
GETTIME:
MOVEM.L D0/D2/A0,-(A7)
MOVEQ #$13,D0
TRAP #1
MOVEM.L (A7)+,D0/D2/A0
RTS
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Implement Subdirectory handling procedures
CHDIR:
BSR STRTOBUF
MOVE.B #$B0,2(A2) ; perform QCHDIR
BRA IBM_EXIT
SHODIR:
MOVE.B #$B1,D0 ; perform QDIR
BSR INIDPRAM ; get dualported ram ...
BSR IBM_EXIT
LEA 6(A2),A1 ; base of string
MOVEQ #0,D2
MOVE.B (A1)+,D2 ; number of bytes to send
MOVE.B #10,0(A1,D2.W) ; add LF
ADDQ.W #1,D2 ; one more for LF
BRA IOSSTRG
MKDIR:
BSR STRTOBUF
MOVE.B #$B2,2(A2) ; perform MAKEDIR
BRA IBM_EXIT
RMDIR:
BSR STRTOBUF
MOVE.B #$B3,2(A2) ; perform REMDIR
BRA IBM_EXIT
STRTOBUF:
BSR STR_RIX
bne.l fini
; Here (a6,a1) points to the string
PEA 0(A6,A1.L)
BSR INIDPRAM ; get address of dual ported
; ram
LEA 6(A2),A3 ; get address of PASCAL
; string
MOVE.L (A7)+,A0
MOVE.W (A0)+,D1 ; get length of string
MOVE.B D1,(A3)+ ; save length for pascal
; string
CPY_PSTR:
MOVE.B (A0)+,(A3)+ ; copy string to IBM
DBRA D1,CPY_PSTR
; MOVE.L A1STO(PC),A1
RTS
fini:
; MOVE.L A1STO(PC),A1
ADDQ.L #4,A7
RTS
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; JAN_USE
JAN_USE:
BSR STR_RIX
BNE.S LB8474
SUBQ.W #3,0(A6,A1.L)
BNE.S LB8472
MOVE.L 2(A6,A1.L),D6
ANDI.L #$5F5F5F00,D6
ADDI.B #$30,D6
LB845A MOVEQ #$00,D0
TRAP #$01
MOVEA.L $48(A0),A0
LEA FS_JAN(PC),A2 ; (changed to LEA(PC) - MJS)
LB8466 CMPA.L 4(A0),A2
BEQ.S LB8476
MOVEA.L (A0),A0
MOVE.L A0,D1
BNE.S LB8466
LB8472 MOVEQ #-$0F,D0
LB8474 RTS
LB8476 MOVE.L D6,$26(A0)
RTS
STR_RIX:
MOVEQ #$0F,D0
AND.B $01(A6,A3.L),D0
SUBQ.B #1,D0
BNE.S LB84A6
MOVE.L A5,-(A7)
LEA $8(A3),A5
BSR CA_GTSTR
MOVEA.L (A7)+,A5
BNE.S LB84F2
MOVEQ #3,D1
ADD.W 0(A6,A1.L),D1
BCLR #0,D1
ADD.L D1,$58(A6)
BRA.S LB84F0
LB84A6 MOVEQ #-$0F,D0
MOVEQ #$00,D1
MOVE.W $02(A6,A3.L),D1
BMI.S LB84F2
LSL.L #3,D1
ADD.L $0018(A6),D1
MOVEQ #$00,D6
MOVE.W $02(A6,D1.L),D6
ADD.L $0020(A6),D6
MOVEQ #$00,D1
MOVE.B $00(A6,D6.L),D1
ADDQ.L #1,D1
BCLR #$00,D1
MOVE.W D1,D4
ADDQ.L #2,D1
SUBA A2,A2
MOVEA.W $011A,A2 ; allocate space on
; arithmetic stack
JSR (A2)
MOVEA.L $58(A6),A1
ADD.W D4,D6
LB84DC SUBQ.L #1,A1
MOVE.B 0(A6,D6.L),0(A6,A1.L)
SUBQ.L #1,D6
DBF D4,LB84DC
SUBQ.L #1,A1
CLR.B 0(A6,A1.L)
LB84F0 MOVEQ #0,D0
LB84F2 RTS
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
END